/**
 * Created by DING on 2025/3/27.
 * */
#include "PythonTask.h"
#include <unistd.h>
#include <cstring>   // memcpy
#include <vector>
#include <iostream>
#include <iomanip> // 用于设置输出格式
#include <chrono>





BaseObject *createPythonTask() {
    return new PythonTask();
}

void destroyPythonTask(BaseObject *p) {
    SAFE_DELETE(p);
}

PythonTask::PythonTask(){
    PyGILState_STATE gstate = PyGILState_Ensure();  // 获取GIL
    // 加载模块
    pModule = PyImport_ImportModule("rsp_task");
    if (!pModule) {
        PyErr_Print();
//        PyGILState_Release(gstate);
        return ;
    }
    // 获取函数
    pFunc = PyObject_GetAttrString(pModule, "py_on_compute");
    if (!pFunc || !PyCallable_Check(pFunc)) {
        Py_XDECREF(pFunc);
        Py_DECREF(pModule);
        PyGILState_Release(gstate);
        return;
    }
    PyGILState_Release(gstate);  // 释放GIL
}

PythonTask::~PythonTask() {
    Py_DECREF(pFunc);
    Py_DECREF(pModule);
}

/* 如果使用了DDS_Reader或者DDS_Writer，则对应的input或者output前64个字节为DataFormat head首部 */
#include <complex>  // 引入 complex 头文件
#include <vector>

void PythonTask::onCompute(buffer_table_t *input, buffer_table_t *output) {
    // 获取输入数据指针
    const char *src0 = input->list[0]->data;
    size_t data_len = input->list[0]->len / sizeof(std::complex<float>);  // 假设数据长度是以字节为单位的，并且每个元素是 complex64

    // 将数据从 char* 转换为 std::vector<std::complex<float>>
    std::vector<std::complex<float>> data(data_len);
    memcpy(data.data(), src0, input->list[0]->len);

    // 调用 thread_safe_compute 传入转换后的数据
    thread_safe_compute(data, output);//传入输出
}


// 全局GIL状态管理
void init_python_env() {
    Py_Initialize();
    PyEval_InitThreads();  // 初始化多线程支持   已过期无需调用
    _import_array();       // 初始化NumPy C-API
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('../PythonTask')");
}

int PythonTask::thread_safe_compute(const std::vector<std::complex<float>>& data, buffer_table_t *output) {
    int ret_code = 0;
    PyGILState_STATE gstate = PyGILState_Ensure();  // 获取GIL
    // 创建 complex64 类型的 NumPy 数组
    npy_intp dims[1] = {static_cast<npy_intp>(data.size())};
    PyObject* pArray = PyArray_SimpleNewFromData(1, dims, NPY_COMPLEX64,
                                                 const_cast<std::complex<float>*>(data.data()));
    // 准备接收返回函数执行结果的变量
    npy_intp dims2[1] = {1};
    long* results = new long[1];
    results[0] = 123;
    PyObject* pResults = PyArray_SimpleNewFromData(1, dims2, NPY_LONG, const_cast<long*>(results));
    char* data_ptr = output->list[0]->data;
    npy_intp dims3[1] = {output->list[0]->len};
    PyObject* pDataCapsule = PyArray_SimpleNewFromData(1, dims3, NPY_CHAR,
                                                      const_cast<char*>(data_ptr));
    if (!pDataCapsule) {
        PyErr_Print();
        PyGILState_Release(gstate);
        return -4;
    }

    // 创建参数元组
    PyObject* pArgs = PyTuple_New(3);
    PyTuple_SetItem(pArgs, 0, pResults);
    PyTuple_SetItem(pArgs, 1, pArray);
    PyTuple_SetItem(pArgs, 2, pDataCapsule);  // 第三个参   数：output 指针
    // 调用函数
    PyObject_CallObject(pFunc, pArgs);
    // 清理资源
    Py_DECREF(pArgs);
    PyGILState_Release(gstate);  // 释放GIL
    return ret_code;
}

